//package com.example.backend.service.impl;
//
//import cn.binarywang.wx.miniapp.api.WxMaService;
//import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
//import com.example.backend.common.api.ResultCode;
//import com.example.backend.common.exception.BusinessException;
//import com.example.backend.common.utils.JwtUtils;
//import com.example.backend.dto.BindDTO;
//import com.example.backend.dto.PhoneBindDTO;
//import com.example.backend.dto.RegisterDTO;
//import com.example.backend.dto.WxLoginDTO;
//import com.example.backend.entity.User;
//import com.example.backend.entity.UserRole;
//import com.example.backend.entity.WxUser;
//import com.example.backend.service.CaptchaService;
//import com.example.backend.service.UserService;
//import com.example.backend.service.WxAuthService;
//import com.example.backend.service.WxUserService;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.security.crypto.password.PasswordEncoder;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.time.LocalDateTime;
//import java.util.HashMap;
//import java.util.Map;
//
//@Slf4j
//@Service
//@RequiredArgsConstructor
//public class WxAuthServiceImpl implements WxAuthService {
//
//    private final WxMaService wxMaService;
//    private final WxUserService wxUserService;
//    private final JwtUtils jwtUtils;
//    private final UserService userService;
//    private final PasswordEncoder passwordEncoder;
//    private final CaptchaService captchaService;
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public Map<String, Object> login(WxLoginDTO loginDTO) {
//        try {
//            // 1. 获取openid和session_key
//            WxMaJscode2SessionResult session = wxMaService.getUserService()
//                    .getSessionInfo(loginDTO.getCode());
//
//            // 2. 获取或创建微信用户
//            WxUser wxUser = wxUserService.getByOpenid(session.getOpenid());
//            if (wxUser == null) {
//                wxUser = new WxUser();
//                wxUser.setOpenid(session.getOpenid());
//                wxUser.setUnionid(session.getUnionid());
//                wxUser.setSessionKey(session.getSessionKey());
//                wxUser.setLastLoginTime(LocalDateTime.now());
//                wxUserService.save(wxUser);
//            } else {
//                wxUser.setSessionKey(session.getSessionKey());
//                wxUser.setLastLoginTime(LocalDateTime.now());
//                wxUserService.updateById(wxUser);
//            }
//
//            // 3. 生成token
//            Map<String, Object> claims = new HashMap<>();
//            claims.put("wxUserId", wxUser.getId());
//            claims.put("openid", wxUser.getOpenid());
//            if (wxUser.getUserId() != null) {
//                claims.put("userId", wxUser.getUserId());
//            }
//            String token = jwtUtils.generateToken(wxUser.getOpenid(), claims);
//
//            // 4. 返回结果
//            Map<String, Object> result = new HashMap<>();
//            result.put("token", token);
//            result.put("wxUser", wxUser);
//            result.put("bound", wxUser.getUserId() != null);
//            return result;
//        } catch (Exception e) {
//            log.error("微信小程序登录失败", e);
//            throw new BusinessException(ResultCode.WX_LOGIN_ERROR);
//        }
//    }
//
//    private void checkBindStatus(String openid, Long userId) {
//        // 检查微信用户是否已绑定
//        WxUser wxUser = wxUserService.getByOpenid(openid);
//        if (wxUser != null && wxUser.getUserId() != null) {
//            throw new BusinessException(ResultCode.WX_ALREADY_BOUND);
//        }
//
//        // 检查系统用户是否已被绑定
//        WxUser boundWxUser = wxUserService.getByUserId(userId);
//        if (boundWxUser != null) {
//            throw new BusinessException(ResultCode.USER_ALREADY_BOUND);
//        }
//    }
//
//    @Transactional(rollbackFor = Exception.class)
//    @Override
//    public void bindUser(String openid, Long userId) {
//        // 检查绑定状态
//        checkBindStatus(openid, userId);
//
//        WxUser wxUser = wxUserService.getByOpenid(openid);
//        if (wxUser == null) {
//            throw new BusinessException(ResultCode.WX_USER_NOT_FOUND);
//        }
//
//        wxUser.setUserId(userId);
//        wxUserService.updateById(wxUser);
//    }
//
//    /**
//     * 通过账号密码绑定
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void bindByPassword(String openid, BindDTO bindDTO) {
//        // 1. 验证用户名密码
//        User user = userService.getByUsername(bindDTO.getUsername());
//        if (user == null) {
//            throw new BusinessException(ResultCode.USER_NOT_FOUND);
//        }
//
//        if (!passwordEncoder.matches(bindDTO.getPassword(), user.getPassword())) {
//            throw new BusinessException(ResultCode.PASSWORD_ERROR);
//        }
//
//        // 2. 执行绑定
//        bindUser(openid, user.getId());
//    }
//
//    /**
//     * 通过手机验证码绑定
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void bindByPhone(String openid, PhoneBindDTO bindDTO) {
//        // 1. 验证验证码
//        if (!captchaService.verifyCaptcha(bindDTO.getPhone(), bindDTO.getCode(), "bind")) {
//            throw new BusinessException(ResultCode.INVALID_CAPTCHA);
//        }
//
//        // 2. 查找用户
//        User user = userService.getByPhone(bindDTO.getPhone());
//        if (user == null) {
//            throw new BusinessException(ResultCode.USER_NOT_FOUND);
//        }
//
//        // 3. 执行绑定
//        bindUser(openid, user.getId());
//    }
//
//    /**
//     * 解除绑定
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void unbind(String openid) {
//        WxUser wxUser = wxUserService.getByOpenid(openid);
//        if (wxUser == null) {
//            throw new BusinessException(ResultCode.WX_USER_NOT_FOUND);
//        }
//
//        wxUser.setUserId(null);
//        wxUserService.updateById(wxUser);
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public boolean registerAndBind(String openid, RegisterDTO registerDTO) {
//        // 1. 检查用户名是否存在
//        if (userService.checkUsernameExists(registerDTO.getUsername())) {
//            throw new BusinessException(ResultCode.USERNAME_EXISTS);
//        }
//
//        // 2. 检查邮箱是否存在
//        if (userService.checkEmailExists(registerDTO.getEmail())) {
//            throw new BusinessException(ResultCode.EMAIL_EXISTS);
//        }
//
//        // 3. 验证验证码
//        if (!captchaService.verifyCaptcha(registerDTO.getEmail(),
//                registerDTO.getCaptcha(), "register")) {
//            throw new BusinessException(ResultCode.INVALID_CAPTCHA);
//        }
//
//        // 4. 创建用户
//        User user = new User();
//        user.setUsername(registerDTO.getUsername());
//        user.setPassword(passwordEncoder.encode(registerDTO.getPassword()));
//        user.setNickname(registerDTO.getNickname());
//        user.setEmail(registerDTO.getEmail());
//        user.setPhone(registerDTO.getPhone());
//        user.setStatus(1);
//
//        if (!userService.save(user)) {
//            throw new BusinessException(ResultCode.REGISTER_FAIL);
//        }
//
//        // 5. 分配默认角色（普通用户）
////        UserRole userRole = new UserRole();
////        userRole.setUserId(user.getId());
////        userRole.setRoleId(2L); // 普通用户角色ID
////
////        if (userRoleMapper.insert(userRole) <= 0) {
////            throw new BusinessException(ResultCode.REGISTER_FAIL);
////        }
//
//        // 6. 绑定微信用户
//        bindUser(openid, user.getId());
//
//        return true;
//    }
//}